# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-08-10
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
from 神笔码靓.码靓库.头像.元素神笔模板 import 头像元素神笔模板
from 神笔码靓.码靓库.头像.头像元素 import 头像元素
from 神笔码靓.码靓库.头像.头像文件定义 import *
from 神笔码靓.码靓库.头像.头像颜色定义 import 常见发色
from 神笔码靓.神笔库 import 神笔模板, 神笔绘图板
from 神笔码靓.神笔库.元素库 import 元素模板, 复用元素
from 神笔码靓.神笔库.线条工具集 import *
from 神笔码靓.神笔库.通用工具集 import *


def 获取已有头像部件列表(部件名称, 性别=None):
    头像根目录 = 资源库目录(头像元素神笔模板.头像根目录)
    if 性别 is not None:
        头像根目录 = os.path.join(头像根目录, 性别)
    if 部件名称 == "眼镜":
        部件名称 = [部件名称, "派对眼罩"]
    else:
        部件名称 = [部件名称]
    部件名称列表 = 列表()
    for fd in os.listdir(头像根目录):
        if not fd.endswith(".svg"):
            continue
        if any([部件名 in fd for 部件名 in 部件名称]):
            # if 性别 is not None:
            #     部件 = f"{性别}/{fd[:-4]}"
            # else:
            部件 = fd[:-4]
            部件名称列表.添加元素(部件)
    部件名称列表 = sorted(部件名称列表)
    return 部件名称列表


# print(获取已有头像部件列表("眼镜"))


def 单头像(头发="头发01", 面部="面部01", 性别="女", 眼睛="眼睛01", 眼镜="眼镜01", 眼镜在头发前=是, 胡须=None, 胡须颜色=颜色.黑色,
        上身="上身01", 眉毛="眉毛01", 眉毛颜色=颜色.黑色, 鼻子="鼻子01", 嘴巴="嘴巴01", 耳朵="耳朵02", 头发颜色=颜色.黑色):
    宽, 高 = 320, 320
    神笔 = 神笔绘图板(作品文件路径="单头像.svg", 宽=宽, 高=高)
    神笔.画矩形(x=0, y=0, 宽=宽, 高=高)
    神笔.神笔模板("头像", 头发=头发, 面部=面部, 性别=性别, 眼睛=眼睛, 眼镜=眼镜, 眼镜在头发前=眼镜在头发前, 胡须=胡须,
            胡须颜色=胡须颜色, 上身=上身, 眉毛=眉毛, 眉毛颜色=眉毛颜色, 鼻子=鼻子, 嘴巴=嘴巴, 耳朵=耳朵, 头发颜色=头发颜色).创造元素()
    神笔.完成()


def 女多头像():
    列数 = 8
    行数 = 100
    宽, 高 = 320 * 列数, 320 * 行数
    神笔 = 神笔绘图板(作品文件路径="超多女头像.svg", 宽=宽, 高=高)
    神笔.画矩形(x=0, y=0, 宽=宽, 高=高)
    # 图片 = 资源库目录(f"素材/漫画卡通/头像/男人头像_01.svg")
    # 神笔.SVG贴图(x=0, y=0, 图片文件=图片)
    # 头发裁剪路径 = [("移动", 0, 0), ("垂直线", 143), ("水平线", 320), ("垂直线", 0), ("闭合",)]
    头发ID = 1
    面部ID = 1
    颜色ID = 0
    眼睛ID = 1
    嘴巴ID = 1

    眼镜ID = 0
    眼镜集合 = [None] + 获取已有头像部件列表("眼镜")

    眉毛ID = 0
    眉毛集合 = 获取已有头像部件列表("眉毛", "女")
    鼻子ID = 0
    鼻子集合 = 获取已有头像部件列表("鼻子", "女")
    上身ID = 0
    上身集合 = 获取已有头像部件列表("上身", "女")
    颜色字典 = 常见发色.颜色字典()
    颜色Keys = list(颜色字典.keys())
    # print(颜色Keys)
    from itertools import product
    编号 = 1
    for 行索引, 列索引 in product(范围(行数), 范围(列数)):
        面部 = "面部" + str(面部ID).rjust(2, "0")
        头发 = "头发" + str(头发ID).rjust(2, "0")
        眼睛 = "眼睛" + str(眼睛ID).rjust(2, "0")
        嘴巴 = "嘴巴" + str(嘴巴ID).rjust(2, "0")
        眼镜 = 眼镜集合[眼镜ID]
        眉毛 = 眉毛集合[眉毛ID]
        鼻子 = 鼻子集合[鼻子ID]
        上身 = 上身集合[上身ID]
        x, y = 320 * 列索引, 320 * 行索引

        眼镜在头发前 = 否

        if 眼镜 is not None and "派对眼罩" in 眼镜:
            眼镜在头发前 = 是

        头像妹 = 头像元素(绘图板=神笔, 部件配置=头像部件配置(头发=头发, 面部=面部, 性别="女", 眼睛=眼睛, 眼镜=眼镜, 眼镜在头发前=眼镜在头发前,
                                       上身=上身,
                                       眉毛=眉毛, 鼻子=鼻子, 嘴巴=嘴巴, 耳朵="耳朵02",  # 装饰="派对眼罩01.svg",
                                       头发颜色=颜色字典[颜色Keys[颜色ID]]))
        头像妹.显示信息().创建().平移(x, y)
        # 矩形宽 = 280
        # 文字下移 = 240
        # 神笔.画矩形(x=x + 160 - 矩形宽 / 2, y=y + 50 + 文字下移, 宽=矩形宽, 高=40, 圆角半径=5, 填充颜色=颜色.白色).透明度(0.8)
        # 文字 = f"{头发},{面部},{眼睛},{嘴巴}"
        # 神笔.写字(x=x, y=y + 文字下移, 文字=文字, 字体大小=13,
        #       垂直基线对齐=文字垂直基线对齐.顶线对齐, 水平基线对齐=文字水平基线对齐.中点对齐).平移(160, 50)
        # 文字 = f"{眉毛},{鼻子},{上身}{'' if 眼镜 is None else ',' + 眼镜}"
        # 神笔.写字(x=x, y=y + 20 + 文字下移, 文字=文字, 字体大小=13,
        #       垂直基线对齐=文字垂直基线对齐.顶线对齐, 水平基线对齐=文字水平基线对齐.中点对齐).平移(160, 50)

        神笔.写字(x=x, y=y, 文字=f"No.{编号}", 字体大小=16, 字体=系统字体.Verdana, 填充颜色=颜色.白色,
              垂直基线对齐=文字垂直基线对齐.顶线对齐, 水平基线对齐=文字水平基线对齐.起始点对齐).平移(25, 25).阴影()

        编号 += 1

        颜色ID += 1
        if 颜色ID >= 返回长度(颜色字典):
            颜色ID = 0

        嘴巴ID += 1
        if 嘴巴ID > 7:
            嘴巴ID = 1

        眼睛ID += 1
        if 眼睛ID > 3:
            眼睛ID = 1

        上身ID += 1
        if 上身ID >= len(上身集合):
            上身ID = 0

        眼镜ID += 1
        if 眼镜ID >= len(眼镜集合):
            眼镜ID = 0

        鼻子ID += 1
        if 鼻子ID >= len(鼻子集合):
            鼻子ID = 0

        面部ID += 1
        if 面部ID > 2:
            面部ID = 1

        眉毛ID += 1
        if 眉毛ID >= len(眉毛集合):
            眉毛ID = 0

        头发ID += 1
        if 头发ID > 38:
            头发ID = 1

        # 嘴巴ID += 1
        # if 嘴巴ID > 3:
        #     嘴巴ID = 1
        #     眼睛ID += 1
        #     if 眼睛ID > 2:
        #         眼睛ID = 1
        #         眼镜ID += 1
        #         if 眼镜ID >= len(眼镜集合):
        #             眼镜ID = 0
        #             鼻子ID += 1
        #             if 鼻子ID >= len(鼻子集合):
        #                 鼻子ID = 0
        #                 面部ID += 1
        #                 if 面部ID > 2:
        #                     面部ID = 1
        #                     头发ID += 1
        #                     眉毛ID += 1
        #                     if 眉毛ID >= len(眉毛集合):
        #                         眉毛ID = 0
        #                     if 头发ID > 38:
        #                         头发ID = 1
    print("头发ID", 头发ID)
    # 神笔.神笔模板("头像", 头发="头发02", 头发颜色=常见发色.棕色).创造元素().平移(320, 0)
    # 头发颜色 = 常见发色.红棕色
    # 神笔.神笔模板("头像", 头发="头发03", 后发="后发03",
    #         头发颜色=头发颜色, 后发颜色=常见发色.颜色加深(头发颜色)).创造元素().平移(640, 0)
    神笔.完成()


def 男多头像():
    列数 = 7
    行数 = 100
    宽, 高 = 320 * 列数, 320 * 行数
    神笔 = 神笔绘图板(作品文件路径="超多男头像.svg", 宽=宽, 高=高)
    神笔.画矩形(x=0, y=0, 宽=宽, 高=高)
    # 图片 = 资源库目录(f"素材/漫画卡通/头像/男人头像_01.svg")
    # 神笔.SVG贴图(x=0, y=0, 图片文件=图片)
    # 头发裁剪路径 = [("移动", 0, 0), ("垂直线", 143), ("水平线", 320), ("垂直线", 0), ("闭合",)]
    头发ID = 1
    面部ID = 1
    颜色ID = 0
    眼睛ID = 1
    嘴巴ID = 1
    眼镜ID = 0
    眼镜集合 = [None, "眼镜01", "眼镜02", "眼镜03", "眼镜04", "眼镜05", "眼镜06", "眼镜07", "眼镜08"]  # , , "派对眼罩01", "派对眼罩02"

    眉毛ID = 0
    眉毛集合 = ["眉毛01"]
    胡须ID = 0
    胡须集合 = [None, "胡须01", "胡须02", "胡须03", "胡须04", "胡须05", "胡须06", "胡须07", "胡须08",
            "胡须09", "胡须10", "胡须11"]
    鼻子ID = 0
    鼻子集合 = ["鼻子01"]
    上身ID = 0
    上身集合 = ["上身01", "上身02", "上身03", "上身04", "上身05", "上身06",
            "上身07", "上身08", "上身09", "上身10", "上身11", "上身12", "上身13", "上身14"]
    颜色字典 = 常见发色.颜色字典()
    颜色Keys = list(颜色字典.keys())
    print(颜色Keys)
    from itertools import product
    编号 = 1
    for 行索引, 列索引 in product(范围(行数), 范围(列数)):
        面部 = "面部" + str(面部ID).rjust(2, "0")
        头发 = "头发" + str(头发ID).rjust(2, "0")
        眼睛 = "眼睛" + str(眼睛ID).rjust(2, "0")
        嘴巴 = "嘴巴" + str(嘴巴ID).rjust(2, "0")
        眼镜 = 眼镜集合[眼镜ID]
        胡须 = 胡须集合[胡须ID]
        眉毛 = 眉毛集合[眉毛ID]
        鼻子 = 鼻子集合[鼻子ID]
        上身 = 上身集合[上身ID]
        x, y = 320 * 列索引, 320 * 行索引

        眼镜在头发前 = 否

        if 眼镜 is not None and "派对眼罩" in 眼镜:
            眼镜在头发前 = 是

        神笔.神笔模板("头像", 部件配置=头像部件配置(头发=头发, 面部=面部, 性别="男", 眼睛=眼睛, 眼镜=眼镜, 眼镜在头发前=眼镜在头发前,
                                  上身=上身, 胡须=胡须,
                                  眉毛=眉毛, 鼻子=鼻子, 嘴巴=嘴巴, 耳朵="耳朵02",
                                  胡须颜色=颜色字典[颜色Keys[颜色ID]],
                                  头发颜色=颜色字典[颜色Keys[颜色ID]])).创造元素().平移(x, y)
        矩形宽 = 280
        文字下移 = 240
        神笔.画矩形(x=x + 160 - 矩形宽 / 2, y=y + 50 + 文字下移, 宽=矩形宽, 高=40, 圆角半径=5, 填充颜色=颜色.白色).透明度(0.8)
        文字 = f"{头发},{面部},{眼睛},{嘴巴}{'' if 胡须 is None else ',' + 胡须}"
        神笔.写字(x=x, y=y + 文字下移, 文字=文字, 字体大小=13,
              垂直基线对齐=文字垂直基线对齐.顶线对齐, 水平基线对齐=文字水平基线对齐.中点对齐).平移(160, 50)
        文字 = f"{眉毛},{鼻子},{上身}{'' if 眼镜 is None else ',' + 眼镜}"
        神笔.写字(x=x, y=y + 20 + 文字下移, 文字=文字, 字体大小=13,
              垂直基线对齐=文字垂直基线对齐.顶线对齐, 水平基线对齐=文字水平基线对齐.中点对齐).平移(160, 50)

        神笔.写字(x=x, y=y, 文字=f"No.{编号}", 字体大小=16, 字体=系统字体.Verdana, 填充颜色=颜色.白色,
              垂直基线对齐=文字垂直基线对齐.顶线对齐, 水平基线对齐=文字水平基线对齐.起始点对齐).平移(25, 25).阴影()

        编号 += 1

        颜色ID += 1
        if 颜色ID >= 返回长度(颜色字典):
            颜色ID = 0

        嘴巴ID += 1
        if 嘴巴ID > 1:
            嘴巴ID = 1

        眼睛ID += 1
        if 眼睛ID > 2:
            眼睛ID = 1

        上身ID += 1
        if 上身ID >= len(上身集合):
            上身ID = 0

        眼镜ID += 1
        if 眼镜ID >= len(眼镜集合):
            眼镜ID = 0

        胡须ID += 1
        if 胡须ID >= len(胡须集合):
            胡须ID = 0

        鼻子ID += 1
        if 鼻子ID >= len(鼻子集合):
            鼻子ID = 0

        面部ID += 1
        if 面部ID > 2:
            面部ID = 1

        眉毛ID += 1
        if 眉毛ID >= len(眉毛集合):
            眉毛ID = 0

        头发ID += 1
        if 头发ID > 27:
            头发ID = 1

    print("头发ID", 头发ID)

    神笔.完成()


class 头像模板生成器:

    def __init__(self, 神笔):
        self.神笔 = 神笔

    def 创造头像模板(self, 部件配置=None) -> 元素模板:
        部件配置 = 部件配置
        return self.神笔.神笔模板("头像", 部件配置=部件配置)

    def 创造头像(self, 部件配置=None) -> 复用元素:
        部件配置 = 部件配置
        return self.创造头像模板(部件配置=部件配置).创造元素()


def 头像生成():
    宽, 高 = 320, 320
    神笔 = 神笔绘图板(作品文件路径="头像生成器.svg", 宽=宽 * 2, 高=高 * 2)
    神笔.显示图框()
    # 神笔.画矩形(0, 0, 宽=神笔.宽, 高=神笔.高, 填充颜色=颜色.红色)
    # 神笔.画矩形(x=0, y=0, 宽=宽, 高=高)

    头发路径 = 资源库目录("素材/漫画卡通/头像/女/头发02.svg")

    # 头发 = 神笔.SVG贴图(x=0,y=0,图片文件=头发路径)

    部件配置 = 头像部件配置(性别="男", 面部="面部01", 眼睛="眼睛01", 鼻子="鼻子01", 耳朵="耳朵01", 嘴巴="嘴巴01",
                  胡须=None, 胡须颜色=常见发色.黑色, 头发=头发路径, 头发颜色=常见发色.蓝色, 眉毛="眉毛01", 眉毛颜色=常见发色.黑色,
                  上身="上身01", 眼镜=None, 显示边框=否)

    头像生成器 = 头像模板生成器(神笔)
    # 头像模板 = 头像生成器.创造头像模板(部件配置=部件配置)
    # 头像模板.创造元素().平移(30, 30)

    头像 = 头像生成器.创造头像(部件配置=部件配置)

    神笔.完成()


if __name__ == '__main__':
    # 头像生成()
    女多头像()
    男多头像()
    # 单头像()
